package cn.kgc.spring05.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author: 课工场
 * @Version: v1.0  2023/2/22
 * @Description:  所有通知 定义在一个类中   切面类
 */
@Component
@Aspect
public class AllAdvice {

    //@Pointcut("execution( * cn.kgc.spring05.entiy.TeacherA.*(..))")
    @Pointcut("@annotation(LogAdvice)")
    public void point(){}
    // 前置通知
    @Before("point()")
    public void before(){
        System.out.println("----------spring aop 前置通知-----------");
    }

    // 后置通知     目标方法能正常执行
    @AfterReturning("point()")
    public void afterReturning(){
        System.out.println("----------spring aop 后置通知-----------");
    }
    // 最终通知   始终要执行
    //@After("point()")
    public void after(){
        System.out.println("----------spring aop 最终通知-----------");
    }

    //异常通知  目标方法出现异常时执行   后置和异常通知只会出现一种
    //@AfterThrowing("point()")
    public void afterThrowing(){
        System.out.println("----------spring aop 异常通知-----------");
    }

    // 环绕通知
    //@Around("point()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint){

        Object proceed = null;
        try {
            System.out.println("----------spring aop 环绕 前通知-----------");
            proceed = joinPoint.proceed();
            System.out.println("----------spring aop 环绕 后通知-----------");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("----------spring aop 环绕 异常通知-----------");
        }finally {
            System.out.println("----------spring aop 环绕 最终通知-----------");
        }
        return proceed;
    }


}
